package 异常的处理.异常的抛出;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 姚东名
 * Date: 2024-06-21
 * Time: 17:12
 */
/*
在编写程序时，如果程序中出现错误，此时就需要将错误的信息告知给调用者，比如：参数检测。

在Java中，可以借助throw关键字，抛出一个指定的异常对象，将错误信息告知给调用者。具体语法如下：

throw new XXXException("一场产生的原因");
 */

//【需求】：实现一个获取数组中任意位置元素的方法。
public class Test {
    public static int getElement(int[] array, int index) {
        //数组为空
        if(array == null) {
            throw new NullPointerException("传递数组为null");
        }
        //数组索引不合法
        if(index < 0 || index >= array.length) {
            throw new ArrayIndexOutOfBoundsException("传递的数组下标不合法");
        }

        return array[index];
    }
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5};
        getElement(array, 3);
    }
}

/*
【注意事项】
1. throw必须写在方法体内部
2. 抛出的对象必须是Exception或者Exception的子类对象
3. 如果抛出的是RunTimeException或者RunTimeException的子类，则可以不用处理，直接交给JVM来处理
4. 如果抛出的是编译时异常，用户必须处理，否则无法通过编译
5. 异常一旦抛出，其后的代码就不会执行
 */

/*
详细介绍第三点：
这句话的意思是，在Java编程中，当抛出的异常是`RuntimeException`或其子类时，程序员可以选择不显式地捕获并处理这些异常。这是因为`RuntimeException`及其子类都是非检查型异常（unchecked exceptions），Java编译器不会强制要求程序员处理这些异常。

与`RuntimeException`不同，`Exception`类（`RuntimeException`的父类）中的其他异常，如`IOException`，是检查型异常（checked exceptions），编译器会强制要求程序员捕获并处理这些异常，否则代码将无法编译通过。

当`RuntimeException`或其子类被抛出时，如果程序员没有显式捕获并处理它们，这些异常将会一直传递到程序的顶层，最终由Java虚拟机（JVM）来处理。JVM处理这些未捕获的异常时，通常会打印出异常的堆栈跟踪信息，并终止程序的执行。

因此，“可以不用处理，直接交给JVM来处理”意味着程序员可以选择不处理这些非检查型异常，而是让JVM在异常发生时自动处理它们。但请注意，这并不意味着在生产环境中应该忽视这些异常。在实际开发中，根据应用的需求和上下文，合理地处理或至少记录这些异常是很重要的。

总的来说，这句话描述了Java中`RuntimeException`及其子类作为非检查型异常的特性，以及它们在没有被显式捕获和处理时会如何被JVM处理。
 */

/*
这句话的意思是，在Java编程中，当抛出的异常是RuntimeException或其子类时，程序员可以选择不显式地捕获并处理这些异常。这是因为RuntimeException及其子类都是非检查型异常（unchecked exceptions），Java编译器不会强制要求程序员处理这些异常。

与RuntimeException不同，Exception类（RuntimeException的父类）中的其他异常，如IOException，是检查型异常（checked exceptions），编译器会强制要求程序员捕获并处理这些异常，否则代码将无法编译通过。

当RuntimeException或其子类被抛出时，如果程序员没有显式捕获并处理它们，这些异常将会一直传递到程序的顶层，最终由Java虚拟机（JVM）来处理。JVM处理这些未捕获的异常时，通常会打印出异常的堆栈跟踪信息，并终止程序的执行。

因此，“可以不用处理，直接交给JVM来处理”意味着程序员可以选择不处理这些非检查型异常，而是让JVM在异常发生时自动处理它们。但请注意，这并不意味着在生产环境中应该忽视这些异常。在实际开发中，根据应用的需求和上下文，合理地处理或至少记录这些异常是很重要的。

总的来说，这句话描述了Java中RuntimeException及其子类作为非检查型异常的特性，以及它们在没有被显式捕获和处理时会如何被JVM处理。
 */